home *** CD-ROM | disk | FTP | other *** search
/ GFX Sensations 1 / Graphic Sensations - Volume 1.iso / tools / amiga / 3d_tools / irit40s.lha / Irit / cagd_lib / cagdmorp.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-12-30  |  2.1 KB  |  63 lines

  1. /******************************************************************************
  2. * CagdMorp.c - A simple too to morph between two compatible surfaces.          *
  3. *******************************************************************************
  4. * Written by Gershon Elber, Jul. 92.                          *
  5. ******************************************************************************/
  6.  
  7. #include "cagd_loc.h"
  8.  
  9. /******************************************************************************
  10. * Given two compatible surfaces (See CagdmakeSrfsCompatible), computes a      *
  11. * convex blend between them according Blend which must be between 0 and 1.    *
  12. * Returned in the new blended surfaces.                          *
  13. ******************************************************************************/
  14. CagdSrfStruct *CagdTwoSrfsMorphing(CagdSrfStruct *Srf1, CagdSrfStruct *Srf2,
  15.                                 CagdRType Blend)
  16. {
  17.     int i, j,
  18.     MaxAxis = CAGD_NUM_OF_PT_COORD(Srf1 -> PType),
  19.     ULength = Srf1 -> ULength,
  20.     VLength = Srf1 -> VLength,
  21.     UOrder = Srf1 -> UOrder,
  22.     VOrder = Srf1 -> VOrder;
  23.     CagdRType **NewPoints,
  24.     **Points1 = Srf1 -> Points,
  25.     **Points2 = Srf2 -> Points,
  26.     Blend1 = 1.0 - Blend;
  27.     CagdSrfStruct *NewSrf;
  28.  
  29.     if (Srf1 -> PType != Srf2 -> PType ||
  30.     Srf1 -> GType != Srf2 -> GType ||
  31.     UOrder != Srf2 -> UOrder ||
  32.     VOrder != Srf2 -> VOrder ||
  33.     ULength != Srf2 -> ULength ||
  34.     VLength != Srf2 -> VLength) {
  35.     FATAL_ERROR(CAGD_ERR_SRFS_INCOMPATIBLE);
  36.     return NULL;
  37.     }
  38.     
  39.     NewSrf = CagdSrfNew(Srf1 -> GType, Srf1 -> PType, ULength, VLength);
  40.     NewSrf -> UOrder = UOrder;
  41.     NewSrf -> VOrder = VOrder;
  42.     NewPoints = NewSrf -> Points;
  43.     if (Srf1 -> UKnotVector != NULL)
  44.     NewSrf -> UKnotVector = BspKnotCopy(Srf1 -> UKnotVector,
  45.                         ULength + UOrder);
  46.     if (Srf1 -> VKnotVector != NULL)
  47.     NewSrf -> VKnotVector = BspKnotCopy(Srf1 -> VKnotVector,
  48.                         VLength + VOrder);
  49.  
  50.     for (i = !CAGD_IS_RATIONAL_PT(Srf1 -> PType); i <= MaxAxis; i++) {
  51.     CagdRType
  52.         *Pts1 = &Points1[i][0],
  53.         *Pts2 = &Points2[i][0],
  54.         *NewPts = &NewPoints[i][0];
  55.  
  56.     for (j = ULength * VLength - 1; j >= 0; j--)
  57.         *NewPts++ = *Pts1++ * Blend1 + *Pts2++ * Blend;
  58.     }
  59.  
  60.     return NewSrf;
  61.  
  62. }
  63.